import request from '@/utils/request'
import config from '@/config'

/**
 * 全局变量，用于存储当前的请求任务实例
 * 方便后续可以手动中断请求
 */
let currentRequestTask = null;

/**
 * 从配置文件获取基础URL
 */
const baseUrl = config.baseUrl

/**
 * 向阿里云发送聊天消息并获取流式响应
 * @param {string} question - 用户输入的问题
 * @param {string} token - 用户认证token
 * @param {Function} onProgress - 处理流式响应的回调函数
 * @returns {Promise} 返回一个Promise对象
 */
export function askAliyun(question, token, onProgress) {
  /*#ifdef MP-WEIXIN*/
  return new Promise((resolve, reject) => {
    // 配置请求参数
    const requestConfig = {
      url: `${baseUrl}/aliyun/ask?inputValue=${encodeURIComponent(question)}`,
      method: 'GET',
      data: { prompt: question },
      header: {
        ...request.header,
        'authorization': token ? `Bearer ${token}` : '',
        'accept': 'text/event-stream',
        'cache-control': 'no-cache',
        'X-DashScope-SSE': 'enable'
      },
      enableChunked: true, // 启用分块传输
    }

    // 发起请求
    currentRequestTask = uni.request({
      ...requestConfig,
      success: (res) => handleRequestSuccess(res, onProgress, reject),
      fail: (err) => handleRequestFail(err, reject),
      complete: () => handleRequestComplete(resolve)
    });

    // 处理流式数据
    handleStreamData(currentRequestTask, onProgress);
  });
  /*#endif*/

  /*#ifdef H5*/
  return handleH5Request(question, token, onProgress);
  /*#endif*/
}

/**
 * 解析ArrayBuffer数据为文本
 * @param {ArrayBuffer} buffer - 二进制数据
 * @returns {string} 解析后的文本
 */
function parseArrayBuffer(buffer) {
  // 使用 encodeURIComponent 和 decodeURIComponent 处理中文
  const rawData = new Uint8Array(buffer);
  const encodedString = String.fromCharCode.apply(null, rawData);
  try {
    return decodeURIComponent(escape(encodedString));
  } catch (e) {
    return encodedString;
  }
}

/**
 * 处理请求成功的响应
 * @param {Object} res - 响应对象
 * @param {Function} onProgress - 进度回调
 * @param {Function} reject - Promise的reject函数
 */
function handleRequestSuccess(res, onProgress, reject) {
  if (res.statusCode === 200) {
    console.log('接收到响应数据:', res.data);
    
    if (res.data instanceof ArrayBuffer) {
      let text = parseArrayBuffer(res.data);
      // 处理文本，去除开头的换行符
      text = text.replace(/^\n+/, '').trim();
      console.log("zhangh"+text)
      if (!text.includes('[DONE]') && onProgress) {
        onProgress(text);
      }
    } else {
      console.error('无效的响应数据类型:', typeof res.data);
    }
  } else {
    console.error('请求失败，状态码:', res.statusCode);
    reject(new Error(`请求失败，状态码: ${res.statusCode}`));
  }
}

/**
 * 处理请求失败的情况
 * @param {Error} err - 错误对象
 * @param {Function} reject - Promise的reject函数
 */
function handleRequestFail(err, reject) {
  currentRequestTask = null;
  console.error('请求失败:', err);
  reject(err);
}

/**
 * 处理请求完成的情况
 * @param {Function} resolve - Promise的resolve函数
 */
function handleRequestComplete(resolve) {
  currentRequestTask = null;
  resolve();
}

/**
 * 处理流式数据的接收
 * @param {Object} requestTask - 请求任务对象
 * @param {Function} onProgress - 进度回调
 */
function handleStreamData(requestTask, onProgress) {
  requestTask.onChunkReceived(res => {
    let text = parseArrayBuffer(res.data);
    // 处理文本，去除开头的换行符
    text = text.replace(/^\n+/, '').trim();
    console.log('接收到分块数据:', text);

    if (!text.includes('[DONE]') && onProgress) {
      onProgress(text);
    }
  });
}

/**
 * 处理H5环境下的请求
 * @param {string} question - 用户问题
 * @param {string} token - 认证token
 * @param {Function} onProgress - 进度回调
 * @returns {Promise} 返回Promise对象
 */
async function handleH5Request(question, token, onProgress) {
  try {
    const response = await fetch(`http://127.0.0.1:8080/aliyun/ask?inputValue=${encodeURIComponent(question)}`, {
      headers: {
        'authorization': token ? `Bearer ${token}` : '',
        'Accept': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive'
      }
    });

    if (!response.ok || !response.body) {
      throw new Error('请求失败');
    }

    await processH5Stream(response.body, onProgress);
    return Promise.resolve();
  } catch (error) {
    return Promise.reject(error);
  }
}

/**
 * 处理H5环境下的流式数据
 * @param {ReadableStream} stream - 可读流
 * @param {Function} onProgress - 进度回调
 */
async function processH5Stream(stream, onProgress) {
  const reader = stream.getReader();
  
  while (true) {
    const { done, value } = await reader.read();
    if (done) break;

    let text = parseArrayBuffer(value);
    // 处理文本，去除开头的换行符
    text = text.replace(/^\n+/, '').trim();
    console.log('接收到分块数据:', text);

    if (!text.includes('[DONE]') && onProgress) {
      onProgress(text);
    }
  }
}

/**
 * 中断当前的请求任务
 */
export function abortAliyunRequest() {
  if (currentRequestTask) {
    currentRequestTask.abort();
    currentRequestTask = null;
  }
}